KMS(Key Management Service)を理解しよう!!
#aws #kms #zenn投稿予定
KMSは意外と理解するの大変。慣れてないと何してるのか訳わからんのでポイントを順番に抑えることが大事。
参考情報は指定の順番で舐めまわして理解した方がいい。
最初は何言ってるかわからないだろうけど、それでも頑張って何回も往復すれば理解できると思う
1. 暗号化の「必要性」と「方法」
hr.icon
KMSが何たるかを理解する前に、以下を把握しておかないとお話にならない。
暗号化とは何か
暗号化がなぜ必要なのか
暗号化を行う一般的な方法は何か
暗号化とは何か
暗号化とは、元の情報(「平文」という)を第3者が見ても意味のわからない情報に変換すること。
暗号化がなぜ必要なのか
大切なデータが第3者に漏洩したとしても、その内容を解読できないようにするために必要。
「そもそも漏洩しないようにしておけばいいのでは?」と思うかもしれない。
ただセキュリティに絶対は無く、情報が第3者に渡ってしまうリスクはいつだってある。
データを意味わからん文字にして保存しておけば、データが漏洩しても内容を解読されずに済む。
この考え方を「多層防御」という。
暗号化を行う一般的な方法
一般的にデータの暗号化を行う道具を総称して「暗号鍵」と言う。
一般でよく見る言葉である秘密鍵/公開鍵も「暗号鍵」(厳密には暗号鍵/複合鍵)だし、共通鍵も「暗号鍵」になる。
暗号化すると言ったら、絶対にこの「暗号鍵」が出てくることを覚えておくといい。
参考
暗号化のメリットとデメリットは?注意するポイントも|ITトレンド
2. 一般的なデータキーの安全な管理方法を知る
hr.icon
KMSが何をしてるか?の前に、データを暗号化する鍵(データキー)を管理する一般的な方法を理解しておくといい。
KMSの管理方法も同じようなものになってる。
データキーを安全に管理する必要がある
実はデータを暗号化しても安心できない。
データキー(データの暗号化に利用した鍵)が漏洩したら、複合に利用されてデータが解読されてしまう。
そこで世の偉い人たちは「データキーを暗号化しよう!」と考えた。
このデータキーを暗号化する鍵のことを「マスターキー」と言う。
「でも、このマスターキーも漏洩したらだめじゃない?」という輩もいるだろう。
・・・全くその通りである。
そこで登場するのが「キー管理インフラストラクチャ(KMI)」と言われるもの。
「鍵管理のいたちごっこ」から逃れるために、安全に鍵管理する仕組みを構築しようと世の人は考えた。
データキー・マスターキーが漏洩しないように、いい感じに管理してくれる仕組みがあればいい。
AWSの世界では、この鍵の安全な管理をAWS KMSがやってくれる。
3. KMSの仕組みを知る
hr.icon
詳しい説明は別の記事・動画に譲るが、簡単にポイントを抑えてここに記載しておく。
KMSで登場する鍵の用語
1. CMK(AWS管理)
AWSが最初から用意してるデフォルトマスターキー。
対応サービスそれぞれ専用で用意されてる。(ex:aws/s3、aws/ebs...)
2. CMK(ユーザー管理)
ユーザーが独自に作成するマスターキー。
KMSをうまく利用したいなら、このCMK(ユーザー管理)の理解・扱いが大事になってくる。
3. CDK
CMKが生成するデータキー。
表舞台にはほぼ出てこない。マネコンで管理するものじゃない。
KMSをちゃんと理解してない人は存在すら知らないかも。
EC2内でKMSの鍵を利用する場合とかに、少し登場する。
KMSでの「暗号化/複合化」の流れ
参考:AWS Key Management Service (KMS) のまとめ - Qiita
この流れは絶対に理解しておかないといけない。この流れが全ての中心。
アプリケーションでKMSの鍵を利用するときも、S3、EBSなどのサービスでKMSが利用されてる時も、同じ流れで「暗号化/複合化」が行われてる。
詳しい説明は参考資料に譲る(めっちゃわかりやすい)
暗号化の流れ
https://scrapbox.io/files/61d4064d7b122e001d04c865.png
複合化の流れ
https://scrapbox.io/files/61d4065ec1e67a001e79b22a.png
4. KMSを利用する上で知っておくべきTips
hr.icon
CMK(ユーザー管理)は、利用ポリシーを設定することが可能、というか設定必須
対象CMKを誰がどう利用できるかというのを「キーポリシー」として設定する必要あり。
IAMポリシー(アイデンティティベース)だけで十分じゃね?リソースベースのポリシー必要?
「1.」で伝えたと思うが、多層防御的に必要。
こういうセキュリティ的に重要なリソースは、リソースベースポリシーでも設定するのが一般的。重厚にする。
暗号化されてるリソースに使われてるCMKの利用権限が無いと、対象リソースの一部機能が制限される
例えば、指定のCMKで暗号化されてるS3バケットがあったとして、このCMKの利用権限がないユーザー/ロールでバケットからオブジェクトをダウンロードしようとする場合。
「ダウンロードできねえよ!!!」とS3から怒られる。
どの機能が制限されるかは対象サービスによって異なる。
暗号化EBSを利用してるEC2とかだと、停止・再起動などはできても、コピーや起動はできない。
様々なサービスがKMSを利用して暗号化できるが、その暗号化の内容は各サービスが握ってる
これは当たり前の話だが、念のため押さえておくといい。
KMSの鍵を利用して、どのデータを暗号化してるのかは、各サービスが決めること。
KMSは鍵を安全に管理して提供してるだけ。
5. KMS理解のためにおすすめ参考文献
hr.icon
以下順番に読んでいくと良さそう
KSMの仕組みを理解する
AWS Black Belt Online Seminar AWS Key Management Service (KMS) 資料公開 | Amazon Web Services ブログ
AWS Key Management Service (KMS) のまとめ - Qiita
流れを具体的に把握する
【初心者】AWS Key Management Service (AWS KMS) を使ってみる - Qiita
EC2内のファイルをKMSの鍵を用いて暗号化してる。
KMSのベストプラクティス
https://d1.awsstatic.com/whitepapers/ja_JP/aws-kms-best-practices.pdf
AWS公式が出してるKMSに関するベストプラクティス。
個人的な所感
AWS内でのリソースへの多層防御的なアクセス制御として利用することもできそう。
いちいちリソースごとにポリシーを作るより、1つのCMKで暗号化設定するようにしておけば楽。